import axios from 'axios'
import { Notification } from 'element-ui'

// axios 配置
axios.defaults.timeout = 5000
axios.defaults.headers.post['Content-Type'] =
    'application/x-www-form-urlencoded;charset=UTF-8'
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.withCredentials = true

// 添加请求拦截器
axios.interceptors.request.use((config) => {
  return config
}, (error) => {
  return Promise.reject(error)
})

// 响应的状态码
// 200请求成功
// 204请求成功，但你查询的地区暂时没有你需要的数据。
// 400请求错误，可能包含错误的请求参数或缺少必选的请求参数。
// 401认证失败，可能使用了错误的KEY、数字签名错误、KEY的类型错误（如使用SDK的KEY去访问Web API）。
// 402超过访问次数或余额不足以支持继续访问服务，你可以充值、升级访问量或等待访问量重置。
// 403无访问权限，可能是绑定的PackageName、BundleID、域名IP地址不一致，或者是需要额外付费的数据。
// 404查询的数据或地区不存在。
// 429超过限定的QPM（每分钟访问次数），请参考QPM说明
// 500无响应或超时，接口服务异常请联系我们
// 添加响应拦截器
axios.interceptors.response.use((response) => {
  const res = response.data
  switch (res.code) {
    case '204':
      Notification({
        message: '你查询的地区暂时没有你需要的数据',
        type: 'error'
      })
      break
    case '400':
      Notification({
        message: '可能包含错误的请求参数或缺少必选的请求参数',
        type: 'error'
      })
      break
    case '401':
      Notification({
        message: '用户认证失败,可能使用了错误的KEY、数字签名错误、KEY的类型错误',
        type: 'error'
      })
      break
    case '402':
      Notification({
        message: '超过访问次数或余额不足以支持继续访问服务，你可以充值、升级访问量或等待访问量重置。',
        type: 'error'
      })
      break
    case '403':
      Notification({
        message: '403无访问权限，可能是绑定的PackageName、BundleID、域名IP地址不一致，或者是需要额外付费的数据',
        type: 'error'
      })
      break
    case '404':
      Notification({
        message: '查询的数据或地区不存在',
        type: 'error'
      })
      break
    case '429':
      Notification({
        message: '超过限定的QPM（每分钟访问次数）',
        type: 'error'
      })
      break
    case '500':
      Notification({
        message: '无响应或超时，接口服务异常请联系我们',
        type: 'error'
      })
      break
    default:
  }
  return Promise.resolve(res)
}, (error) => {
  return Promise.reject(error)
})

export default function request (method, url, data, extra) {
  // 在请求数据上添加用户认证key
  data = data ? Object.assign(data, { key: '06465adf5511443fa1114fec9119b357' }) : { key: '06465adf5511443fa1114fec9119b357' }

  // 处理请求的url和数据
  data = method === 'get' ? { params: data } : data
  // 发送请求
  const axiosUrl = {
    method,
    url
  }
  return new Promise((resolve, reject) => {
    const config = extra
      ? Object.assign(extra, axiosUrl, data)
      : Object.assign(axiosUrl, data)
    axios(config)
      .then(
        (response) => {
          resolve(response)
        },
        (error) => {
          reject(error)
        }
      )
      .catch((error) => {
        reject(error)
      })
  }).catch((error) => {
    console.log(error)
  })
}
